import {observe} from './observe/index'
export function initState(vm) {
  const opts = vm.$options
  if (opts.data) {
    initData(vm)
  }
}


// vm代理vm._data
function proxy(vm,target,key){
  Object.defineProperty(vm,key,{
    get(){
      return vm[target][key]
    },
    set(newValue){
      if (newValue === vm[target][key])return
      vm[target][key] = newValue
    }
  })
}


function initData(vm) {
  let data = vm.$options.data // 可能是对象/函数 根实例可以对象和函数，组件必须函数
  data = typeof data === 'function' ? data.call(vm) : data
  vm._data = data
  
  // 对数据进行劫持， vue2采用了api defineProperty
  observe(data)

  //将vm._data 用vm来代理
  for(let key in data){
    proxy(vm,'_data', key)
  }
}